AWS CLIでサービス固有エンドポイントを使ってMediaConvertのコマンドをシンプルに実行する!
はじめに
清水です。先日、AWS CLI含むAWS SDKでサービス固有エンドポイント(Service-specific endpoints)という設定が利用可能になるというアップデートがありました。以下のしばたのブログエントリで詳細を紹介しています。
AWS SDK実行時のサービスエンドポイントを環境変数または設定ファイル内のプロファイルで設定できるようになった、というアップデートです。このエンドポイントの指定にはPrivate Endpointからのサービスアクセスや独自のエンドポイントなどを想定しているのですが、私は「この機能を使えばあのサービスのコマンド、シンプルに実行できるのでは!?」と思いついたものがありました。そのサービスとはズバリ!AWS Elemental MediaConvertです。ファイルベースの動画変換サービスであるMediaConvertですが、そのAPIの実行の際にはアカウントならびにリージョン固有のendpointを指定する必要があります。
AWS CLIであれば、実行時に--endpoint-url
オプションを常に付ける必要がある、というわけですね。(このエンドポイントを確認するdescribe-endpoints
コマンドだけはオプション不要ではありますが。)
AWS SDKで新たに利用可能になったService-specific endpoints(サービス固有エンドポイント)の設定を使えば、この常に付与していた--endpoint-url
オプションが不要になるのでは!?と考え、実際に確認してみました。結果、このService-specific endpointsを環境変数もしくは設定ファイル内で指定することにより、毎回付与していた--endpoint-url
が不要となることがわかりました。MediaConvertのAWS CLIコマンドをシンプルに実行する方法として以下にまとめてみたいと思います。
AWS CLIでMediaConvertコマンドを使うときにはendpointを指定する
改めてAWS CLIでAWS Elemental MediaConvert用のコマンドを実行するお作法を確認してみましょう。(詳細についてはこちらのエントリを参照ください。)
検証を行ったAWS CLI環境は以下になります。
% aws --version aws-cli/2.13.3 Python/3.11.4 Darwin/21.6.0 exe/x86_64 prompt/off
またAWS環境として、IAMユーザー管理用アカウントとMediaConvertなど操作対象のAWSアカウントが別れた状態です。後者のAWSアカウントではIAMロールを用いて管理用アカウントのIAMロールからスイッチロールします。Jumpアカウントと呼ばれるものですね。(参考: マルチアカウントな AWS環境のマネジメントコンソールへのアクセス方法をまとめてみた | DevelopersIO)
IAMロール使用の際は設定ファイル内で例えば以下のように指定します。(参考: AWS CLI で IAM ロールを使用する - AWS Command Line Interface)
[profile adminaccount] output = json region = ap-northeast-1 [profile account.numberone] output = json region = ap-northeast-1 role_arn = arn:aws:iam::123456789012:role/iam-role mfa_serial = arn:aws:iam::1111222233334444:mfa/iam-user source_profile = adminaccount
実行時には--profile
オプションを指定するぐあいですね。
% aws s3 ls --profile account.numberone 2020-06-19 02:25:10 my-s3-bucket-1 2022-04-30 01:51:30 my-s3-bucket-2 ……
これは環境変数AWS_PROFILE
を指定することで実行時の--profile
オプションを省略することが可能です。
% export AWS_PROFILE=account.numberone % aws s3 ls 2020-06-19 02:25:10 my-s3-bucket-1 2022-04-30 01:51:30 my-s3-bucket-2
さて、本題のMediaConvert操作用のAWS CLIコマンドです。例としてmediaconvert list-jobs
コマンドを実行してみましょう。
上記のようにエラーとなってしまいますね。解決策としてはメッセージの通り、customer-specificなendpointを利用する必要があります。
% aws mediaconvert list-jobs An error occurred (BadRequestException) when calling the ListJobs operation: You must use the customer-specific endpoint 'https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com' for this operation.
--endpoint-url
オプションでcustomer-specific endpointを指定すれば、コマンドが実行できます。
% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt' \ --endpoint-url https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com [ "2023-06-30T10:05:28+09:00", "2023-06-30T10:05:13+09:00", …… "2023-06-26T13:25:11+09:00", "2023-06-26T13:24:40+09:00" ]
なおこのcustomer-specific endpointは固定であるためアカウントとリージョンが同じであればハードコードもしくはキャッシュするべきである(毎回呼び出すことはAPIスロットル上限に触れてしまうため行わない)ことがAPI Referenceに記載されています。(Getting Started with AWS Elemental MediaConvert Using the AWS SDKs or the AWS CLI - AWS Elemental MediaConvert API Reference)
またmediaconvert describe-endpoints
コマンドについては--endpoint-url
オプションなしで実行が可能です。Outputとしてcustomer-specificなendpointが返るコマンドですね。
サービス固有エンドポイントを設定してコマンド実行時のendpoint指定を省略する
MediaConvertをAWS CLIで使う際のお作法を確認したところで、これをAWS CLI(AWS SDK)の新機能Service-specific endpointsを使うことで、どうシンプルになるのかを確認してみましょう。
環境変数を指定するパターン
まずは環境変数を指定するパターンです。AWS各サービス共通のエンドポイントを設定するAWS_ENDPOINT_URL
環境変数に、先ほどのMediaConvertのcustomer-specificなendpointを指定してみます。
% export AWS_ENDPOINT_URL=https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
これで--endpoint-url
オプションを省略してMediaConvert用AWS CLIコマンドを実行することが可能になります。
% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt' [ "2023-06-30T10:05:28+09:00", "2023-06-30T10:05:13+09:00", …… "2023-06-26T13:25:11+09:00", "2023-06-26T13:24:40+09:00" ]
ただし、このAWS_ENDPOINT_URL
はAWS各サービス共通のエンドポイントを設定することになるため、設定したままMediaConvert以外のAWS CLIを実行しようとすると問題が生じます。
% aws s3 ls An error occurred (403) when calling the ListBuckets operation: Forbidden
そこで、各サービス固有のエンドポイントを設定するAWS_ENDPOINT_URL_"サービス名"
を使用します。こちらは以下ドキュメントに記載がありますね。(参考: AWS_ENDPOINT_URL環境変数およびプロファイル設定で使うサービス名について | DevelopersIO)
MediaConvertの場合はAWS_ENDPOINT_URL_MEDIACONVERT
で指定すればよいので、上記AWS_ENDPOINT_URL
設定を削除した環境で以下を実行し設定します。
% export AWS_ENDPOINT_URL_MEDIACONVERT=https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
MediaConvertのコマンド、それ以外のコマンドの双方が実行できますね。
% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt' [ "2023-06-30T10:05:28+09:00", "2023-06-30T10:05:13+09:00", …… "2023-06-26T13:25:11+09:00", "2023-06-26T13:24:40+09:00" ] % aws s3 ls 2020-06-19 02:25:10 my-s3-bucket-1 2022-04-30 01:51:30 my-s3-bucket-2 ……
なお、この環境下でmediaconvert describe-endpoints
の実行には失敗しますが、すでにMediaConvertのcustomer-specificなendpointは確認済みであるため問題は生じない認識です。
% aws mediaconvert describe-endpoints An error occurred (AccessDeniedException) when calling the DescribeEndpoints operation: Unable to determine service/operation name to be authorized
設定ファイル内で指定するパターン
環境変数で指定する方法を確認してきましたが、もう一つ、設定ファイル(~/.aws/config
)内で設定することも可能です。こちらも確認していきましょう。(環境変数AWS_ENDPOINT_URL
とAWS_ENDPOINT_URL_MEDIACONVERT
は削除した上で確認しています。)
環境変数AWS_ENDPOINT_URL
と同様の設定が、endpoint_url
パラメータを指定することで可能です。
[profile adminaccount] output = json region = ap-northeast-1 [profile account.numberone] output = json region = ap-northeast-1 role_arn = arn:aws:iam::123456789012:role/iam-role mfa_serial = arn:aws:iam::1111222233334444:mfa/iam-user source_profile = adminaccount endpoint_url = https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
ただしこれだと先ほどと同様、MediaConvertのコマンド実行の際には--endpoint-url
は省略可能ですが、MediaConvert以外のコマンド実行に問題が発生します。
% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt' [ "2023-06-30T10:05:28+09:00", "2023-06-30T10:05:13+09:00", …… "2023-06-26T13:25:11+09:00", "2023-06-26T13:24:40+09:00" ] % aws s3 ls An error occurred (403) when calling the ListBuckets operation: Forbidden
service
セクションを使って各サービスごとのエンドポイントを指定するとこで、MediaConvertのコマンド実行の際に--endpoint-url
を省略しつつ、MediaConvert以外のコマンドを実行させることが可能です。
[profile adminaccount] output = json region = ap-northeast-1 [profile account.numberone] output = json region = ap-northeast-1 role_arn = arn:aws:iam::123456789012:role/iam-role mfa_serial = arn:aws:iam::1111222233334444:mfa/iam-user source_profile = adminaccount services = mediaconvert-for-account.numberone [services mediaconvert-for-account.numberone] mediaconvert = endpoint_url = https://mpxxxxxxx.mediaconvert.ap-northeast-1.amazonaws.com
% aws mediaconvert list-jobs --query 'Jobs[*].CreatedAt' [ "2023-06-30T10:05:28+09:00", "2023-06-30T10:05:13+09:00", …… "2023-06-26T13:25:11+09:00", "2023-06-26T13:24:40+09:00" ] % aws s3 ls 2020-06-19 02:25:10 my-s3-bucket-1 2022-04-30 01:51:30 my-s3-bucket-2 ……
環境変数と比べて、設定ファイルではプロファイルやリージョンごとにエンドポイントを指定できるため、複数の設定を~/.aws/config
にまとめておき--profile
で使い分ける、といったことが可能になるかと思います。
まとめ
AWS CLIで利用可能になったサービス固有エンドポイント(Service-specific endpoints)設定を使用することで、AWS Elemental MediaConvertのコマンドがシンプルに実行できるようになることを確認しました。MediaConvertのAWS CLI実行時には--endpoint-url
オプションが必要ですが、これをService-specific endpointsで先に設定しておくことで、実行ごとの--endpoint-url
オプションの指定が省略できます。Service-specific endpointsは環境変数もしくは設定ファイル内で指定できるので、ユースケースにあわせて使い分けましょう。またAWS各サービス共通のエンドポイントを設定すると、MediaConvert以外のサービス用コマンドの実行に問題が生じます。MediaConvertのエンドポイントのみを指定するのがよいかと思います。